const express = require('express')
const http = require('http')
const socketIoClient = require('socket.io-client')
const { Server } = require('socket.io')
const cors = require('cors')

const app = express()
const server = http.createServer(app)
app.use(cors())

app.use(express.json())

// 连接到运行在5000端口的后端服务
const backendSocket = socketIoClient('http://localhost:5000')
// 看来发送事件的时候不需要定义，接收事件的时候要定义
backendSocket.on('output', (data) => {
  // console.log('训练输出 : ', data.output)
  // 将训练输出转发给所有连接到中间件服务器的前端客户端
  io.emit('output', data)
})

const io = new Server(server, {
  cors: {
    origin: '*',
    methods: ['GET', 'POST'],
  },
})
io.on('result', (data) => {
  // console.log('1111接受到确认:', data)
})
// 在中间件服务器的某个地方定义等待确认的逻辑
function waitForAllConfirmations() {
  return new Promise((resolve, reject) => {
    io.on('data_source_result', (data) => {
      // console.log('2222接受到确认:', data)
      resolve(data) // 已收到所有必要的确认
    })
    // 设置超时以防万一
    setTimeout(() => {
      // reject(new Error('请求超时'))
    }, 3000) // 等待10秒
  })
}
// 暂且不考虑同意的弹窗
app.post('/data_source', async (req, res) => {
  // console.log('请求确认:', req)
  io.emit('data_source_query', { message: '新的训练请求已接收，正在处理...' })

  try {
    await waitForAllConfirmations()
    // console.log('所有确认已收到')
    // 执行后续逻辑...
    res.json({ result: 'success' })
  } catch (error) {
    console.error(error)
    res.status(500).json({ error: error.message })
  }
})

app.post('/train', (req, res) => {
  // console.log('被启动train:', req.body)

  // 发送train请求到后端
  backendSocket.emit('train', req.body)
  // console.log('已经发送:', req.body)

  // 监听来自后端的train_result事件
  const onResponse = (data) => {
    // // console.log('Received train result from backend:', data)
    // 将后端的响应直接返回给前端
    res.json(data)
    // 为了避免重复监听，接收到数据后立即移除监听器
    backendSocket.off('train_result', (onResponse) => {
      console.log(onResponse)
    })
  }
  backendSocket.on('train_result', onResponse)
})

server.listen(3001, () => {
  // console.log('中间件服务器端运行在http://localhost:3001')
})
